VBXE neu

← Zurück zum Forum

VBXE neu

Hallo, ich habe mich die letzten Wochen u.a. mit dem Thema meines Raycasters in der Grundtheorie beschäftigt und bin zu folgenden Schlüssen und Entschlüssen gekommen:

  1. Das Projekt ist einfach zu spannend, um es für immer zu vergraben.
  2. Der Ansatz mit Bresenham ist machbar, aber problematisch - besser ist das Verfahren mittels DDA-Verfahren, das will ich nun umsetzen. Dafür muss ich das ganze Projekt allerdings von Grund auf neu programmieren!
  3. Ich will das gleich für VBXE machen, das hat den Vorteil, daß ich eine deutlich bessere Auflösung mit mehr Farben bekommen und wahrscheinlich auch noch die Geschwindigkeit okay ist...

Also starte ich mit VBXE - hier!

Hier will ich nun VBXE von Grund auf erklären und von leicht bis komplex entwickeln, am Ende soll ein Manuskript herausspringen, wo jeder nachlesen kann. Danach baue ich anhand der neu erlernten VBXE Fähigkeiten den Raycaster ganz neu - am Ende soll ein schönes Spiel entstehen!

AntwortZitat

Hallo Peter

Und dann machen wir als Club daraus ein schönes Buch, das wie auch in Englisch übersetzen und verschicken es als Jahresgabe. ;-)

Tschüß

Mathy

Schreibe nicht der Absicht zu, was man mit Dummheit oder Ignoranz erklären kann.

AntwortZitat

Wir suchen schon seit einiger Zeit / einigen Jahren Leute, die Lust haben sich um die Jahresgabe zu kümmern, da das Magazinteam bereits mit Magazinen und Sondermagazinen voll ausgelastet ist. Bisher haben wir niemanden gefunden.

Ist wohl auch einer der Gründe, warum das Buch zu BeweDOS 1.5 zum selber drucken "beworben" wurde und die Diskette in der PD-Bibliothek gelandet ist, statt wie geplant als Jahresgabe zu erscheinen.

Ein (geplantes) Buch zu VBXE, Fast Basic, etc. wird an dieser Jahresgabe(n) Situation nicht viel ändern können - wenn keiner da ist, der das für den Club anpackt...

AntwortZitat

CharlieChaplin schrieb am 29.10.2026 19:30:

Wir suchen schon seit einiger Zeit / einigen Jahren Leute, die Lust haben sich um die Jahresgabe zu kümmern, da das Magazinteam bereits mit Magazinen und Sondermagazinen voll ausgelastet ist. Bisher haben wir niemanden gefunden.

Ja, das ist so. Werde ich auch auf der JHV ansprechen.

Ist wohl auch einer der Gründe, warum das Buch zu BeweDOS 1.5 zum selber drucken "beworben" wurde und die Diskette in der PD-Bibliothek gelandet ist, statt wie geplant als Jahresgabe zu erscheinen.

Jein. Als Jahresgabe wollen/wollten wir die Deutsche Ausgabe des BW-DOS Buches machen. Zum Selbstdruck gibt es die englische Version des Buches.

Eine frühe Übersetzung gibt es, da aber schon wieder zwei neue Versionen des Buches in der Zwischenzeit erstellt wurde, muss die Übersetzung noch einmal überarbeitet werden.

Ein (geplantes) Buch zu VBXE, Fast Basic, etc. wird an dieser Jahresgabe(n) Situation nicht viel ändern können - wenn keiner da ist, der das für den Club anpackt...

So ist es ...

https://mastodon.social/@cstrotm https://abbuc.social

AntwortZitat

Bevor es nun morgen in den Urlaub geht, hier jetzt der VBXE Start! Ein ganz einfaches Programm - Hallo Welt natürlich! Wir schreiben "Hallo Welt" in die Mitte des Bildschirmes, wobei jeder Buchstabe eine andere Farbe bekommt. Alles läuft via VBXE. Den ersten Code habe ich wirklich so einfach gehalte, wie es geht - ganz ohne "schnick schnack". Das Programm fragt extra nur ganz rudimentär ab, ob ein vbxe da ist - und tatsächlich auch nur, wenn es bei $D6xx liegt (bitte entsprechend bei Altirra so einstellen). Sollte es auf $D7xx liegen bleiben, dann bitte entsprechend im Code direkt ändern!

Die Farben kommen aus der Atari-Palette (später ändern wir das).

;==============================================================================
;  HALLO WELT mit VBXE - jeder Buchstabe in einer anderen Farbe
;  Assembler: MADS    ->  mads halloeinfach_vbxe.asm -o:halloeinfach_vbxe.xex
;  Taste druecken = zurueck ins DOS
;
;  So funktioniert's:
;  Die VBXE hat eigenen Speicher (VRAM). Dorthin kommen drei Dinge:
;  1. die XDL  - sagt der VBXE, WAS sie WO auf dem Bildschirm zeigen soll
;  2. der Zeichensatz - wir kopieren einfach den aus dem Atari-ROM
;  3. der Text - je Buchstabe 2 Bytes: Zeichen + Farbe
;  Die CPU kommt ans VRAM ueber ein "Fenster" bei $9000.
;==============================================================================

;------------------------------------------------------------------------------
;  VARIABLEN
;------------------------------------------------------------------------------
VBXE_AN     = $D640     ; schreiben: 1 = VBXE-Bild an, 0 = aus
VBXE_TYP    = $D640     ; lesen: $10 = VBXE vorhanden
XDL_ADR     = $D641     ; wo die XDL im VRAM liegt (3 Bytes)
FENSTER_AN  = $D65E     ; Fenster aufmachen
FENSTER_BANK= $D65F     ; welcher VRAM-Teil im Fenster zu sehen ist

FENSTER     = $9000     ; hier sieht die CPU das VRAM
TEXT_ZEILE  = $9100     ; Textzeile im VRAM (Adresse $0100)
ZEICHENSATZ = $9800     ; Zeichensatz im VRAM (Adresse $0800)

ANTIC       = $022F     ; normales Atari-Bild (0 = aus)
TASTE       = $02FC     ; letzte Taste ($FF = keine)

            org $2000

;------------------------------------------------------------------------------
;  DISPLAYLISTE (XDL)
;------------------------------------------------------------------------------
xdl         dta a($0024),111    ; 112 leere Bildzeilen
            dta a($8961),7      ; dann 8 Bildzeilen Text (= 1 Textzeile):
            dta a($0100),0      ;   Text liegt im VRAM bei $0100
            dta a(160)          ;   80 Zeichen x 2 Bytes pro Zeile
            dta 1               ;   Zeichensatz bei $0800 (= 1 x 2 KB)
            dta $01,$FF         ;   Atari-Farben, vor allem anderen
                                ; ($8961 = Textmodus, Ende der XDL)

; Text: Buchstabe, Farbe (Atari-Farbwert wie bei SETCOLOR)
text        dta d'H',$36, d'A',$28, d'L',$1C, d'L',$0E, d'O',$4A
            dta d' ',0
            dta d'W',$58, d'E',$76, d'L',$6A, d'T',$3A, d'!',$1E

;------------------------------------------------------------------------------
;  HAUPTPROGRAMM
;------------------------------------------------------------------------------
start       lda VBXE_TYP
            cmp #$10            ; ist eine VBXE da?
            bne ende            ; nein -> sofort zurueck

            lda #0
            sta ANTIC           ; normales Atari-Bild aus
            jsr vram_fuellen    ; XDL, Zeichensatz und Text ins VRAM

            lda #0              ; XDL liegt bei VRAM-Adresse 0
            sta XDL_ADR
            sta XDL_ADR+1
            sta XDL_ADR+2
            lda #1
            sta VBXE_AN         ; VBXE-Bild an!

;--- Hauptschleife: warten, bis eine Taste gedrueckt wird ---
            lda #$FF
            sta TASTE
warten      lda TASTE
            cmp #$FF
            beq warten

            lda #0              ; alles wieder aus
            sta VBXE_AN
            sta FENSTER_BANK
            lda #$22
            sta ANTIC           ; normales Atari-Bild wieder an
            lda #$FF
            sta TASTE
ende        rts                 ; zurueck ins DOS

;------------------------------------------------------------------------------
;  PROZEDUREN
;------------------------------------------------------------------------------

; vram_fuellen: Fenster oeffnen, dann XDL, Zeichensatz und Text kopieren
vram_fuellen
            lda #$98            ; Fenster bei $9000, CPU darf zugreifen
            sta FENSTER_AN
            lda #$80            ; Fenster an, VRAM ab Adresse 0 zeigen
            sta FENSTER_BANK

            ldx #0              ; 256 Durchlaeufe:
kopieren    lda xdl,x           ;   XDL kopieren
            sta FENSTER,x
            lda #0              ;   Textzeile loeschen
            sta TEXT_ZEILE,x
            lda $E000,x         ;   Zeichensatz aus dem ROM (1 KB)
            sta ZEICHENSATZ,x
            lda $E100,x
            sta ZEICHENSATZ+$100,x
            lda $E200,x
            sta ZEICHENSATZ+$200,x
            lda $E300,x
            sta ZEICHENSATZ+$300,x
            inx
            bne kopieren

            ldx #21             ; Text (22 Bytes) in die Bildmitte
text_kop    lda text,x
            sta TEXT_ZEILE+68,x ; 68 = Spalte 34
            dex
            bpl text_kop
            rts

            run start

viel Spass beim testen...

AntwortZitat

... im nächsten Schritt nehme ich jeden einzelnen Programmschritt detailiert auseinander und erkläre ihn. Ich fange mit der VBXE Displaylist - also der xdl an ...

AntwortZitat

========================================================= Das XDL-Steuerwort der VBXE =========================================================

INHALT

1. Grundidee: Wie die VBXE die XDL liest
2. Die Schalterbank im Überblick
3. Jedes Bit im Detail (Bit 0 bis Bit 15)
4. Typische Kombinationen
5. Häufige Fehler
6. Kurz-Spickzettel

============================================================================== 1. GRUNDIDEE: WIE DIE VBXE DIE XDL LIEST ==============================================================================

Die XDL (eXtended Display List) ist eine Liste von Befehlen im VRAM der VBXE. Jeder Befehl besteht aus:

  - einem Steuerwort (16 Bit = 2 Bytes)
  - und danach, je nach eingeschalteten Bits, 0 bis viele Zusatz-Bytes

Am Anfang jedes Bildes springt die VBXE an die Adresse, die in XDL_ADR ($D641-$D643) steht, und liest den ersten Befehl. Sie führt ihn für eine oder mehrere Bildzeilen aus und liest dann den nächsten Befehl. Das geht so weiter, bis ein Befehl mit gesetztem END-Bit fertig ist.

Man kann sich das Steuerwort wie eine Reihe von 16 Schiebeschaltern vorstellen:

  Schalter oben  = Bit 1 = an
  Schalter unten = Bit 0 = aus

Es gibt zwei Sorten Schalter:

  a) Reine Schalter: Sie schalten etwas ein oder aus. Danach folgt nichts.
     (TMON, GMON, OVOFF, MAPON, MAPOFF, HR, LR, END)

  b) Daten-Schalter: Sie sagen "hinter mir kommen noch Bytes".
     (RPTL, OVADR, OVSCRL, CHBASE, MAPADR, MAPPAR, OVATT)

Die Zusatz-Bytes stehen IMMER in der Reihenfolge der Bits, von Bit 0 aufwärts. Schalter, die unten sind, werden übersprungen.

Wichtig: Was ein Befehl einstellt (Adresse, Zeichensatz, Farben ...), bleibt in der Regel für die folgenden Befehle gültig, bis es wieder geändert wird. Darum muss man nicht in jedem Befehl alles neu angeben.

Im Speicher steht das Steuerwort wie beim 6502 üblich: erst das niedrige Byte (Bit 0-7), dann das hohe Byte (Bit 8-15). In MADS (in unserem ersten Beispiel):
.word %1000100101100001 oder
dta a($8961)-> im Speicher: $61, $89

========================================================== 2. DIE SCHALTERBANK IM ÜBERBLICK ==========================================================

  Hohes Byte (Bit 15 bis 8)
  +-----+-----+-----+-----+-------+--------+--------+--------+
  | 15  | 14  | 13  | 12  |  11   |   10   |    9   |    8   |
  | END |  -  | LR  | HR  | OVATT | MAPPAR | MAPADR | CHBASE |
  +-----+-----+-----+-----+-------+--------+--------+--------+

  Niedriges Byte (Bit 7 bis 0)
  +--------+-------+------+--------+-------+-------+------+------+
  |    7   |   6   |   5  |    4   |   3   |   2   |   1  |   0  |
  | OVSCRL | OVADR | RPTL | MAPOFF | MAPON | OVOFF | GMON | TMON |
  +--------+-------+------+--------+-------+-------+------+------+

  Bit  Name    Wert   Zusatz-Bytes
  ---  ------  -----  ------------
   0   TMON    $0001  -
   1   GMON    $0002  -
   2   OVOFF   $0004  -
   3   MAPON   $0008  -
   4   MAPOFF  $0010  -
   5   RPTL    $0020  1
   6   OVADR   $0040  5
   7   OVSCRL  $0080  2
   8   CHBASE  $0100  1
   9   MAPADR  $0200  5
  10   MAPPAR  $0400  4
  11   OVATT   $0800  2
  12   HR      $1000  -
  13   LR      $2000  -
  14   -       $4000  -   (unbenutzt)
  15   END     $8000  -

========================================================== 3. JEDES BIT IM DETAIL ==========================================================

Die Bits sind hier von Bit 0 aufwärts sortiert, also genau in der Reihenfolge, in der auch die Zusatz-Bytes gelesen werden.


Bit 0 TMON ($0001) Textmodus an Zusatz: keine

Was es macht: Das Overlay wird ab dieser Zeile als Textbildschirm gezeichnet.

Wie der Text aufgebaut ist: - Jedes Zeichen ist 8 x 8 Punkte gross. - Bei normaler Breite passen 80 Zeichen in eine Zeile. - Jedes Zeichen braucht im Bildspeicher 2 Bytes: Byte 1 = Zeichencode (welcher Buchstabe) Byte 2 = Farbe (Nummer in der Palette) Darum ist bei 80 Zeichen die Schrittweite 160 Bytes. - Eine Textzeile ist 8 Bildzeilen hoch. Mit RPTL = 7 (also 8 Zeilen) bekommt man genau eine Textzeile.

Was man dazu braucht: - OVADR: wo der Text im VRAM liegt - CHBASE: wo der Zeichensatz liegt - meistens OVATT: Breite, Palette, Priorität

Bei uns: Befehl 2 hat TMON an -> unser "HALLO WELT!".

Achtung: TMON und GMON nicht gleichzeitig einschalten. Es ist entweder Text oder Grafik.


Bit 1 GMON ($0002) Grafikmodus an Zusatz: keine

Was es macht: Das Overlay wird als Bitmap gezeichnet: Jeder Bildpunkt hat seine eigene Farbe, direkt aus dem Bildspeicher.

Wie viele Punkte, wie viele Farben? Das bestimmen HR und LR (Bit 12/13): weder HR noch LR 320 Punkte, 1 Byte pro Punkt, 256 Farben -> 320 Bytes pro Zeile LR 160 Punkte, 1 Byte pro Punkt, 256 Farben -> 160 Bytes pro Zeile HR 640 Punkte, 4 Bit pro Punkt, 16 Farben -> 320 Bytes pro Zeile

Was man dazu braucht: - OVADR: Adresse des Bildes und Schrittweite (meist = Bytes pro Zeile) - RPTL: für wie viele Zeilen

Beispiel: Ein Vollbild mit 320 x 200 Punkten in 256 Farben: GMON | RPTL | OVADR, RPTL = 199, Schrittweite = 320 -> braucht 64.000 Bytes VRAM.


Bit 2 OVOFF ($0004) Overlay aus Zusatz: keine

Was es macht: In diesen Bildzeilen zeichnet die VBXE kein Overlay. Man sieht nur das,was ANTIC und GTIA liefern (oder bei abgeschaltetem ANTIC: Hintergrund).

Wofür: - Leerzeilen oben, damit das eigentliche Bild weiter unten anfängt - Bereiche, in denen das normale Atari-Bild sichtbar bleiben soll

Bei uns: Befehl 1 = OVOFF | RPTL mit 111 -> 112 leere Bildzeilen, damit unsere Textzeile etwa in der Bildmitte steht.


Bit 3 MAPON ($0008) Farbmap an Zusatz: keine

Was es macht: Schaltet die Farbmap (Attribut-Map) ein. Die Farbmap ist ein zweites Raster, das über das Bild gelegt wird. Es teilt den Bildschirm in Kästchen (Zellen). Für jedes Kästchen kann man eigene Farben und Einstellungen festlegen.

Wofür: Vor allem, um das normale ANTIC-Bild bunter zu machen: Die Farben der Playfield-Register können pro Kästchen anders sein. So bekommt z.B. ein GRAPHICS-Modus viel mehr Farben als normal.

Was man dazu braucht: - MAPADR: wo die Farbmap im VRAM liegt - MAPPAR: wie gross die Kästchen sind und wie gescroll wird

Hinweis: MAPON muss man nur einmal setzen. Die Map bleibt an, bis MAPOFF kommt.


Bit 4 MAPOFF ($0010) Farbmap aus Zusatz: keine

Was es macht: Das Gegenstück zu MAPON: Ab hier ist die Farbmap wieder aus.

Wofür: Wenn nur ein Teil des Bildschirms (z.B. ein Spielfeld oben) die Farbmap benutzen soll und der Rest (z.B. eine Statuszeile) nicht.

Achtung: MAPON und MAPOFF nie gleichzeitig setzen.


Bit 5 RPTL ($0020) Zeilen wiederholen Zusatz: 1 Byte

Was es macht: Legt fest, für wie viele Bildzeilen dieser Befehl gilt.

Das Zusatz-Byte: Anzahl der Bildzeilen MINUS 1 0 -> 1 Zeile 7 -> 8 Zeilen (eine Textzeile) 111 -> 112 Zeilen 255 -> 256 Zeilen (Maximum mit einem Befehl)

Ohne RPTL: Der Befehl gilt nur für genau 1 Bildzeile, danach kommt sofort der nächste Befehl.

Wofür: Fast immer. Ohne RPTL bräuchte man für jedes Bild hunderte Befehle. Ohne RPTL zu arbeiten lohnt sich nur, wenn man wirklich jede Zeile anders einstellen will (z.B. für Effekte).

Bei uns: Befehl 1: 111 (112 Leerzeilen), Befehl 2: 7 (8 Textzeilen).


Bit 6 OVADR ($0040) Bildspeicher-Adresse Zusatz: 5 Bytes

Was es macht: Sagt der VBXE, wo im VRAM die Daten für das Overlay liegen, und wie weit sie von einer Zeile zur nächsten springen soll.

Die 5 Zusatz-Bytes: Byte 1 Adresse Bits 0-7 Byte 2 Adresse Bits 8-15 Byte 3 Adresse Bits 16-18 (das VRAM ist bis 512 KB gross) Byte 4 Schrittweite, niedriges Byte Byte 5 Schrittweite, hohes Byte

Die Schrittweite: So viele Bytes geht die VBXE nach jeder Zeile weiter. Normalerweise ist das genau die Länge einer Zeile: Text 80 Zeichen -> 160 Grafik 320 Punkte -> 320 Grafik 160 Punkte -> 160 Ist die Schrittweite größer als eine Zeile, ist das Bild im Speicher breiter als der Bildschirm. Dann kann man waagerecht darin herumscrollen, indem man nur die Adresse ändert.

Bei uns: 0, 1, 0 -> VRAM $000100 .word 160 -> 160 Bytes pro Textzeile

Tipp: Will man mitten im Bild auf einen anderen Speicherbereich umschalten (z.B. eine feste Statuszeile unter einem Scroll-Bild),gibt man einfach im nächsten Befehl wieder OVADR an.


Bit 7 OVSCRL ($0080) Feinscrolling Zusatz: 2 Bytes

Was es macht: Verschiebt das Overlay punktgenau, damit Scrolling weich läuft und nicht in ganzen Zeichen oder Bytes springt.

Die 2 Zusatz-Bytes: Byte 1 waagerechter Feinscroll (um wie viele Punkte nach links) Byte 2 senkrechter Feinscroll (bei Text: ab welcher der 8 Punktzeilen eines Zeichens begonnen wird)

Wofür: Grobes Scrollen macht man über die Adresse (OVADR), das feine Scrollen zwischen zwei Schritten über OVSCRL. Das ist dasselbe Prinzip wie HSCROL und VSCROL beim ANTIC.

Bei uns: nicht benutzt.


Bit 8 CHBASE ($0100) Zeichensatz-Adresse Zusatz: 1 Byte

Was es macht: Sagt der VBXE, wo im VRAM der Zeichensatz für den Textmodus liegt.

Das Zusatz-Byte: Die Adresse in Schritten von 2 KB (2048 Bytes): 0 -> $00000 1 -> $00800 2 -> $01000 ... Der Zeichensatz muss also immer an einer 2-KB-Grenze beginnen.

Aufbau: 8 Bytes pro Zeichen, ein Byte pro Punktzeile, wie beim normalen Atari. Man kann einfach den Zeichensatz aus dem Atari-ROM ins VRAM kopieren,oder einen eigenen entwerfen.

Bei uns: 1 -> Zeichensatz bei VRAM $0800 (den ROM-Zeichensatz haben wir dorthin kopiert).

Hinweis: Nur für den Textmodus (TMON) wichtig.


Bit 9 MAPADR ($0200) Farbmap-Adresse Zusatz: 5 Bytes

Was es macht: Wie OVADR, nur für die Farbmap: Wo liegt sie im VRAM und wie weit geht es pro Kästchen-Zeile weiter.

Die 5 Zusatz-Bytes: Byte 1-3 Adresse der Farbmap (Bits 0-7, 8-15, 16-18) Byte 4-5 Schrittweite (niedriges, hohes Byte)

Aufbau der Farbmap: Jedes Kästchen belegt 4 Bytes. Darin stehen Farben fuer die Playfield-Farben und ein Byte mit weiteren Einstellungen für dieses Kästchen.

Bei uns: nicht benutzt.


Bit 10 MAPPAR ($0400) Farbmap-Einstellungen Zusatz: 4 Bytes

Was es macht: Legt fest, wie die Kästchen der Farbmap aussehen und wo sie stehen.

Die 4 Zusatz-Bytes: Byte 1 waagerechter Scrollwert der Map Byte 2 senkrechter Scrollwert der Map Byte 3 Breite eines Kästchens (Wert + 1 Punkte, bis 32) Byte 4 Höhe eines Kästchens (Wert + 1 Zeilen, bis 32)

Beispiel: Kästchen 8 x 8 Punkte -> Byte 3 = 7, Byte 4 = 7. Das passt genau zu den Zeichen eines Textmodus.

Bei uns: nicht benutzt.


Bit 11 OVATT ($0800) Overlay-Eigenschaften Zusatz: 2 Bytes

Was es macht: Stellt Breite, Paletten und Priorität des Overlays ein.

Byte 1: Breite und Paletten Bits 0-1 Breite des Overlays 0 = schmal (256 Punkte) 1 = normal (320 Punkte) 2 = breit (336 Punkte) Bits 2-3 unbenutzt Bits 4-7 zwei Palettennummern (0-3), je 2 Bits: eine für das Playfield (ANTIC-Bild), eine für das Overlay. Laut VBXE-Doku: Bits 4-5 = Playfield, Bits 6-7 = Overlay.

Die VBXE hat 4 Paletten mit je 256 Farben. Palette 0 ist beim Start mit
den Atari-Farben belegt. Die anderen füllt man selbst über PSEL, CSEL und CR/CG/CB.

Byte 2: Priorität Legt fest, ob das Overlay vor oder hinter den anderen Bildteilen liegt (Playfield-Farben und Player/Missiles). Jedes Bit steht für einen Bildteil, 1 = Overlay liegt davor. $FF -> Overlay liegt vor allem anderen $00 -> Overlay liegt hinter allem

Bei uns: 17 ($11) und 255 ($FF).


Bit 12 HR ($1000) Hohe Auflösung Zusatz: keine

Was es macht: Grafikmodus mit 640 Punkten pro Zeile. Dafür hat jeder Punkt nur 4 Bit, also 16 Farben. Ein Byte enthält 2 Punkte.

Nur sinnvoll mit GMON.


Bit 13 LR ($2000) Niedrige Auflösung Zusatz: keine

Was es macht: Grafikmodus mit nur 160 Punkten pro Zeile, jeder Punkt doppelt so breit. Weiterhin 1 Byte pro Punkt, also 256 Farben. Spart Speicher und ist schneller zu bemalen.

Nur sinnvoll mit GMON.

Merke zu HR und LR: beide aus = normal, 320 Punkte, 256 Farben (Normalfall) LR an = 160 Punkte HR an = 640 Punkte, 16 Farben beide an = nicht erlaubt


Bit 14 (unbenutzt) ($4000) Zusatz: keine

Ohne Funktion. Immer 0 lassen, damit spätere VBXE-Versionen nicht überrascht werden.

Bit 15 END ($8000) Ende der XDL Zusatz: keine

Was es macht: Kennzeichnet den letzten Befehl der Liste. Wenn seine Zeilen abgelaufen sind, liest die VBXE in diesem Bild keine weiteren Befehle mehr. Beim nächsten Bild fängt sie wieder vorne bei XDL_ADR an.

Ohne END: Die VBXE würde einfach weiterlesen und den Speicher hinter der XDL als Befehle deuten. Das gibt ein wildes Bild.

Bei uns: Befehl 2 hat END an. Befehl 1 nicht, weil danach noch etwas kommt.

========================================================== 4. TYPISCHE KOMBINATIONEN ==========================================================

a) Leerzeilen OVOFF | RPTL + 1 Byte -> z.B. Platz oben schaffen (unser Befehl 1)

b) Textbereich TMON | RPTL | OVADR | CHBASE | OVATT + 1 + 5 + 1 + 2 Bytes -> unser Befehl 2 (mit END)

c) Vollbild-Grafik 320 x 200, 256 Farben GMON | RPTL | OVADR | OVATT | END + 1 + 5 + 2 Bytes RPTL = 199, Schrittweite 320

d) Bild oben, Statuszeile unten Befehl 1: GMON | RPTL | OVADR ... (das Bild) Befehl 2: TMON | RPTL | OVADR | CHBASE | END (die Statuszeile) -> zweites OVADR zeigt auf den Text der Statuszeile

e) Weich scrollendes Bild Pro Bild ändert das Programm im VBI die OVADR-Bytes (grob) und die OVSCRL-Bytes (fein) direkt in der XDL im VRAM.

========================================================== 5. HÄUFIGE FEHLER ==========================================================

- Zusatz-Bytes in falscher Reihenfolge
  -> immer von Bit 0 aufwärts: RPTL, OVADR, OVSCRL, CHBASE, MAPADR, MAPPAR, OVATT

- Ein Bit gesetzt, aber die Bytes dazu vergessen (oder umgekehrt)
  -> alle folgenden Befehle verrutschen

- RPTL mit der echten Zeilenzahl statt Zeilen MINUS 1
  -> eine Zeile zu viel

- END vergessen
  -> VBXE liest Datenmüll als Befehle

- Schrittweite passt nicht zum Modus
  -> Bild schief oder verzerrt

- Zeichensatz nicht an 2-KB-Grenze oder nicht ins VRAM kopiert
  -> nur Kästchen oder Müll statt Buchstaben

- TMON und GMON gleichzeitig, oder HR und LR gleichzeitig
  -> nicht erlaubt

========================================================== 6. KURZ-ÜBERSICHT ==========================================================

  Bit  Name    Wert   Bytes  Kurz
  ---  ------  -----  -----  ---------------------------
   0   TMON    $0001    -    Text
   1   GMON    $0002    -    Grafik
   2   OVOFF   $0004    -    Overlay aus
   3   MAPON   $0008    -    Farbmap an
   4   MAPOFF  $0010    -    Farbmap aus
   5   RPTL    $0020    1    Zeilen - 1
   6   OVADR   $0040    5    Adresse (3)+Schrittweite(2)
   7   OVSCRL  $0080    2    Feinscroll waag. / senkr.
   8   CHBASE  $0100    1    Zeichensatz / 2048
   9   MAPADR  $0200    5    Map-Adresse (3) + Schrittweite (2)
  10   MAPPAR  $0400    4    Map-Scroll (2) + Kästchengrösse (2)
  11   OVATT   $0800    2    Breite/Paletten + Priorität
  12   HR      $1000    -    640 Punkte, 16 Farben
  13   LR      $2000    -    160 Punkte
  14   -       $4000    -    unbenutzt
  15   END     $8000    -    Ende der XDL

==========================================================

Alle "Schalter", die in uunserem ersten Beispiel "Hallo Welt" noch nicht benutzt worden sind, werden später noch genauer und ausführlicher mit Beispielen erklärt!

AntwortZitat

Und hier jetzt Hallo Welt mit eigener Farbpalette. Die Erklärungen sind im Code kommentiert... falls Fragen auftauchen -> nur zu!!

;==============================================================================
;  HALLO WELT mit VBXE - jeder Buchstabe in einer anderen Farbe
;  mit EIGENER Farbpalette (statt der eingebauten Atari-Farben)
;  Assembler: MADS    ->  mads hallo_vbxe_palette.asm -o:hallo_vbxe_palette.xex
;  Taste druecken = zurueck ins DOS
;
;  So funktioniert's:
;  Die VBXE hat eigenen Speicher (VRAM). Dorthin kommen drei Dinge:
;  1. die XDL  - sagt der VBXE, WAS sie WO auf dem Bildschirm zeigen soll
;  2. der Zeichensatz - wir kopieren einfach den aus dem Atari-ROM
;  3. der Text - je Buchstabe 2 Bytes: Zeichen + Farbnummer
;  Die CPU kommt ans VRAM ueber ein "Fenster" bei $9000.
;
;  Die eigene Palette:
;  Die VBXE hat 4 Paletten (0-3) mit je 256 Farben. Palette 0 enthaelt die
;  normalen Atari-Farben. Wir fuellen Palette 1 mit eigenen Farben, die wir
;  frei als Rot-, Gruen- und Blauwert (je 0-255) festlegen. Im Text steht
;  dann nur noch die Farbnummer 1, 2, 3 ... aus unserer Palette.
;
;  NEU in dieser Fassung: Die XDL ist lesbar aufgebaut. Jeder Schalter des
;  16-Bit-Steuerworts hat einen eigenen Namen und steht als Binaerzahl da.
;  Das erzeugte Programm ist Byte fuer Byte dasselbe wie vorher.
;==============================================================================

;------------------------------------------------------------------------------
;  VARIABLEN
;------------------------------------------------------------------------------
VBXE_AN     = $D640     ; schreiben: 1 = VBXE-Bild an, 0 = aus
VBXE_TYP    = $D640     ; lesen: $10 = VBXE vorhanden
XDL_ADR     = $D641     ; wo die XDL im VRAM liegt (3 Bytes)
FARB_NR     = $D644     ; welche Farbnummer wir aendern wollen
PALETTE_NR  = $D645     ; welche Palette (0-3) wir aendern wollen
ROT         = $D646     ; Rotanteil der Farbe (0-255)
GRUEN       = $D647     ; Gruenanteil der Farbe (0-255)
BLAU        = $D648     ; Blauanteil (danach geht FARB_NR selbst +1)
FENSTER_AN  = $D65E     ; Fenster aufmachen
FENSTER_BANK= $D65F     ; welcher VRAM-Teil im Fenster zu sehen ist

FENSTER     = $9000     ; hier sieht die CPU das VRAM
TEXT_ZEILE  = $9100     ; Textzeile im VRAM (Adresse $0100)
ZEICHENSATZ = $9800     ; Zeichensatz im VRAM (Adresse $0800)

ANTIC       = $022F     ; normales Atari-Bild (0 = aus)
TASTE       = $02FC     ; letzte Taste ($FF = keine)

;--- NEU: die 16 Schalter des XDL-Steuerworts --------------------------------
;  Jeder Schalter ist genau ein Bit. Steht ein Schalter auf 1, folgen bei
;  manchen danach Zusatz-Bytes in der XDL (in Klammern angegeben).
;
;                     Bit: 5432109876543210
XDL_TMON    = %0000000000000001 ; Bit  0: Textmodus an
XDL_GMON    = %0000000000000010 ; Bit  1: Grafikmodus an
XDL_OVOFF   = %0000000000000100 ; Bit  2: Overlay aus (leere Zeilen)
XDL_MAPON   = %0000000000001000 ; Bit  3: Farbkarte an
XDL_MAPOFF  = %0000000000010000 ; Bit  4: Farbkarte aus
XDL_RPTL    = %0000000000100000 ; Bit  5: Zeilen wiederholen     (+1 Byte)
XDL_OVADR   = %0000000001000000 ; Bit  6: Bildadresse+Schritt   (+5 Bytes)
XDL_OVSCRL  = %0000000010000000 ; Bit  7: Feinscrollen           (+2 Bytes)
XDL_CHBASE  = %0000000100000000 ; Bit  8: Zeichensatz-Lage       (+1 Byte)
XDL_MAPADR  = %0000001000000000 ; Bit  9: Farbkarten-Adresse    (+5 Bytes)
XDL_MAPPAR  = %0000010000000000 ; Bit 10: Farbkarten-Werte      (+4 Bytes)
XDL_OVATT   = %0000100000000000 ; Bit 11: Breite/Palette/Prior. (+2 Bytes)
XDL_HR      = %0001000000000000 ; Bit 12: hohe Aufloesung
XDL_LR      = %0010000000000000 ; Bit 13: niedrige Aufloesung
                                ; Bit 14: unbenutzt
XDL_END     = %1000000000000000 ; Bit 15: Ende der XDL

            org $2000

;------------------------------------------------------------------------------
;  DISPLAYLISTE (XDL)
;------------------------------------------------------------------------------
xdl

;--- Befehl 1: oben 112 leere Bildzeilen --------------------------------------
;  Schalter an: OVOFF + RPTL
;  Binaer:   %0000000000100100  (= $0024)
;                      |  |
;                      |  +-- Bit 2: OVOFF - Overlay aus, nichts zeigen
;                      +----- Bit 5: RPTL  - Befehl wiederholen
            dta a(XDL_OVOFF | XDL_RPTL)
            .by 111                     ; RPTL:  111 + 1 = 112 Zeilen

;--- Befehl 2: 8 Bildzeilen Text (= 1 Textzeile), dann Schluss ----------------
;  Schalter an: TMON + RPTL + OVADR + CHBASE + OVATT + END
;  Binaer:   %1000100101100001  (= $8961)
;             |   |  | ||    |
;             |   |  | ||    +-- Bit  0: TMON   - Textmodus
;             |   |  | |+------- Bit  5: RPTL   - Befehl wiederholen
;             |   |  | +-------- Bit  6: OVADR  - Bildadresse folgt
;             |   |  +---------- Bit  8: CHBASE - Zeichensatz-Lage folgt
;             |   +------------- Bit 11: OVATT  - Breite/Palette folgt
;             +----------------- Bit 15: END    - danach ist die XDL zu Ende
            dta a(XDL_TMON | XDL_RPTL | XDL_OVADR | XDL_CHBASE | XDL_OVATT | XDL_END)

;  Die Zusatz-Bytes kommen immer in der Reihenfolge der Bits:
;  erst RPTL, dann OVADR, dann CHBASE, dann OVATT.
            .by 7                       ; RPTL:   7 + 1 = 8 Bildzeilen
            .by 0,1,0               ; OVADR:  Text im VRAM bei $000100
            .by 160,0                 ; OVADR:  Schritt 80 Zeichen x 2 Bytes
            .by 1                       ; CHBASE: Zeichensatz bei 1 x 2 KB = $0800
            .by %00010001               ; OVATT:  Breite und Palette
                                        ;   Bit 0-1 = 01: normale Breite (320)
                                        ;   Bit 4-5 = 01: Overlay nimmt Palette 1
                                        ;   Bit 6-7 = 00: Playfield nimmt Palette 0
            .by 255                   ; OVATT:  Prioritaet $FF = vor allem anderen

; Text: Buchstabe, Farbnummer aus UNSERER Palette (0 = durchsichtig)
text        dta d'H',1, d'A',2, d'L',3, d'L',4, d'O',5
            dta d' ',0
            dta d'W',6, d'E',7, d'L',8, d'T',9, d'!',10

; unsere eigene Palette - Farben 1 bis 10, je Rot, Gruen, Blau
farben      dta 255,  0,  0     ; Farbe  1: Rot
            dta 255,128,  0     ; Farbe  2: Orange
            dta 255,255,  0     ; Farbe  3: Gelb
            dta 128,255,  0     ; Farbe  4: Hellgruen
            dta   0,255,  0     ; Farbe  5: Gruen (geht nur mit eigener Palette!)
            dta   0,192,255     ; Farbe  6: Himmelblau
            dta  64, 64,255     ; Farbe  7: Blau
            dta 160, 64,255     ; Farbe  8: Lila
            dta 255,  0,255     ; Farbe  9: Pink
            dta 255,128,192     ; Farbe 10: Rosa
FARB_ANZ    = (*-farben)/3      ; Anzahl der Farben (hier 10)

;------------------------------------------------------------------------------
;  HAUPTPROGRAMM
;------------------------------------------------------------------------------
start       lda VBXE_TYP
            cmp #$10            ; ist eine VBXE da?
            bne ende            ; nein -> sofort zurueck

            lda #0
            sta ANTIC           ; normales Atari-Bild aus
            jsr vram_fuellen    ; XDL, Zeichensatz und Text ins VRAM
            jsr palette_setzen  ; eigene Farben in Palette 1 laden

            lda #0              ; XDL liegt bei VRAM-Adresse 0
            sta XDL_ADR
            sta XDL_ADR+1
            sta XDL_ADR+2
            lda #1
            sta VBXE_AN         ; VBXE-Bild an!

;--- Hauptschleife: warten, bis eine Taste gedrueckt wird ---
            lda #$FF
            sta TASTE
warten      lda TASTE
            cmp #$FF
            beq warten

            lda #0              ; alles wieder aus
            sta VBXE_AN
            sta FENSTER_BANK
            lda #$22
            sta ANTIC           ; normales Atari-Bild wieder an
            lda #$FF
            sta TASTE
ende        rts                 ; zurueck ins DOS

;------------------------------------------------------------------------------
;  PROZEDUREN
;------------------------------------------------------------------------------

; vram_fuellen: Fenster oeffnen, dann XDL, Zeichensatz und Text kopieren
vram_fuellen
            lda #$98            ; Fenster bei $9000, CPU darf zugreifen
            sta FENSTER_AN
            lda #$80            ; Fenster an, VRAM ab Adresse 0 zeigen
            sta FENSTER_BANK

            ldx #0              ; 256 Durchlaeufe:
kopieren    lda xdl,x           ;   XDL kopieren
            sta FENSTER,x
            lda #0              ;   Textzeile loeschen
            sta TEXT_ZEILE,x
            lda $E000,x         ;   Zeichensatz aus dem ROM (1 KB)
            sta ZEICHENSATZ,x
            lda $E100,x
            sta ZEICHENSATZ+$100,x
            lda $E200,x
            sta ZEICHENSATZ+$200,x
            lda $E300,x
            sta ZEICHENSATZ+$300,x
            inx
            bne kopieren

            ldx #21             ; Text (22 Bytes) in die Bildmitte
text_kop    lda text,x
            sta TEXT_ZEILE+68,x ; 68 = Spalte 34
            dex
            bpl text_kop
            rts

; palette_setzen: schreibt unsere Farben 1-10 in Palette 1
palette_setzen
            lda #1
            sta PALETTE_NR      ; Palette 1 bearbeiten
            sta FARB_NR         ; bei Farbe 1 anfangen
            ldx #0              ; X = Lesezeiger in der Tabelle
            ldy #FARB_ANZ       ; Y = wie viele Farben noch
farb_kop    lda farben,x        ; Rot holen
            sta ROT
            lda farben+1,x      ; Gruen holen
            sta GRUEN
            lda farben+2,x      ; Blau holen
            sta BLAU            ; -> Farbe fertig, FARB_NR zaehlt selbst +1
            inx                 ; 3 Bytes weiter zur naechsten Farbe
            inx
            inx
            dey                 ; eine Farbe weniger uebrig
            bne farb_kop        ; noch Farben da? -> weiter
            rts

            run start

AntwortZitat

... die xDL habe ich jetzt mal versucht noch "lesbarer" und übersichtlicher zu gestalten... die Übersicht "leidet" dann etwas durch die vielen Erklärungen ;-)

Als nächsten Schritt lassen wir natürlich den Text "Hallo Welt" schön feingescrollt von oben nach unten durchlaufen...

AntwortZitat

... und hier jetzt der Code fürs feinscrolling... Das war jetzt nicht so aufwendig und läuft ähnlich ab, wie beim Atari ohne VBXE. Man manipuliert einfach die xdl indem man an 3. Stell die Anzahl der Leerzeilen jeweils erhöht. Dafür habe ich einfach an entsprechender Stelle das label xdl_leer eingefügt, was man dann pro Durchlauf erhöhen muss. Weil unser Fenster bei $9000 steht und die xdl Im VBXE-Speicher ganz vorne bei $000000 beginnt, schreibe ich den jeweilig neuen Wert bei $9002 rein (der landet dann bei $000002 also an der Stelle xdl_leer. Dazu kommt noch eine Warteschleife, damit es nicht zu schnell läuft...

;==============================================================================
;  HALLO WELT mit VBXE - eigene Farbpalette und SCROLLEN
;  Der Text wandert von ganz oben nach ganz unten. Ist er unten angekommen,
;  faengt er oben wieder an.
;  Assembler: MADS    ->  mads hallo_vbxe_scroll.asm -o:hallo_vbxe_scroll.xex
;  Taste druecken = zurueck ins DOS
;
;  So funktioniert's:
;  Die VBXE hat eigenen Speicher (VRAM). Dorthin kommen drei Dinge:
;  1. die XDL  - sagt der VBXE, WAS sie WO auf dem Bildschirm zeigen soll
;  2. der Zeichensatz - wir kopieren einfach den aus dem Atari-ROM
;  3. der Text - je Buchstabe 2 Bytes: Zeichen + Farbnummer
;  Die CPU kommt ans VRAM ueber ein "Fenster" bei $9000.
;
;  Die eigene Palette:
;  Die VBXE hat 4 Paletten (0-3) mit je 256 Farben. Palette 0 enthaelt die
;  normalen Atari-Farben. Wir fuellen Palette 1 mit eigenen Farben (Rot,
;  Gruen, Blau je 0-255). Im Text steht nur die Farbnummer 1, 2, 3 ...
;
;  NEU - das Scrollen:
;  Die XDL beginnt mit leeren Bildzeilen, erst danach kommt der Text.
;  Wie viele leere Zeilen es sind, steht in EINEM Byte der XDL (dem RPTL-Wert
;  von Befehl 1). Wir zaehlen dieses Byte in jedem Bild um 1 hoch - dadurch
;  rutscht der Text jedes Mal eine Bildzeile tiefer. Ist er unten, setzen
;  wir das Byte wieder auf 0, und der Text steht wieder ganz oben.
;  Einen eigenen Zaehler brauchen wir nicht - das XDL-Byte IST der Zaehler.
;  Weil das Fenster zum VRAM offen bleibt, aendern wir das Byte direkt in
;  der XDL im VRAM - die VBXE sieht die Aenderung im naechsten Bild.
;==============================================================================

;------------------------------------------------------------------------------
;  VARIABLEN
;------------------------------------------------------------------------------
VBXE_AN     = $D640     ; schreiben: 1 = VBXE-Bild an, 0 = aus
VBXE_TYP    = $D640     ; lesen: $10 = VBXE vorhanden
XDL_ADR     = $D641     ; wo die XDL im VRAM liegt (3 Bytes)
FARB_NR     = $D644     ; welche Farbnummer wir aendern wollen
PALETTE_NR  = $D645     ; welche Palette (0-3) wir aendern wollen
ROT         = $D646     ; Rotanteil der Farbe (0-255)
GRUEN       = $D647     ; Gruenanteil der Farbe (0-255)
BLAU        = $D648     ; Blauanteil (danach geht FARB_NR selbst +1)
FENSTER_AN  = $D65E     ; Fenster aufmachen
FENSTER_BANK= $D65F     ; welcher VRAM-Teil im Fenster zu sehen ist

FENSTER     = $9000     ; hier sieht die CPU das VRAM
TEXT_ZEILE  = $9100     ; Textzeile im VRAM (Adresse $0100)
ZEICHENSATZ = $9800     ; Zeichensatz im VRAM (Adresse $0800)

ANTIC       = $022F     ; normales Atari-Bild (0 = aus)
TASTE       = $02FC     ; letzte Taste ($FF = keine)
UHR         = $0014     ; NEU: zaehlt in jedem Bild 1 hoch (50 x pro Sekunde)

ZEILE_MAX   = 231       ; NEU: tiefste Stelle: 232 leere + 8 Textzeilen = 240
                        ;      (240 Bildzeilen ist die volle Hoehe der VBXE)

LEER_IM_VRAM= $9002     ; NEU: Anzahl leerer Zeilen in der XDL im VRAM
                        ;      Die XDL liegt im VRAM ab $000000, das Byte ist
                        ;      ihr 3. Byte (Nr. 2) -> im Fenster bei $9002

            org $2000

;------------------------------------------------------------------------------
;  DISPLAYLISTE (XDL)
;------------------------------------------------------------------------------
xdl

;--- Befehl 1: leere Bildzeilen ueber dem Text ---
            .byte %00100100     ; Bit 0-7:  OVOFF (Bit 2), RPTL (Bit 5)
            .byte %00000000     ; Bit 8-15: nichts
xdl_leer    .byte 0             ; RPTL: 0 + 1 = 1 leere Zeile am Anfang
                                ; NEU: dieses Byte zaehlt das Scrollen hoch!

;--- Befehl 2: 8 Bildzeilen Text, dann Ende ---
            .byte %01100001     ; Bit 0-7:  TMON (Bit 0), RPTL (Bit 5), OVADR (Bit 6)
            .byte %10001001     ; Bit 8-15: CHBASE (Bit 8), OVATT (Bit 11), END (Bit 15)
            .byte 7             ; RPTL:   7 + 1 = 8 Bildzeilen
            .byte $00, $01, $00 ; OVADR:  Text im VRAM bei $000100 (niedrig, mittel, hoch)
            .byte 160, 0        ; OVADR:  Schritt 160 = 80 Zeichen x 2 Bytes (niedrig, hoch)
            .byte 1             ; CHBASE: Zeichensatz bei 1 x 2 KB = $0800
            .byte %00010001     ; OVATT:  Bit 0-1 = 01: normale Breite
                                ;         Bit 4-5 = 01: Overlay nimmt Palette 1
            .byte %11111111     ; OVATT:  Prioritaet = vor allem anderen

; Text: Buchstabe, Farbnummer aus UNSERER Palette (0 = durchsichtig)
text        dta d'H',1, d'A',2, d'L',3, d'L',4, d'O',5
            dta d' ',0
            dta d'W',6, d'E',7, d'L',8, d'T',9, d'!',10

; unsere eigene Palette - Farben 1 bis 10, je Rot, Gruen, Blau
farben      dta 255,  0,  0     ; Farbe  1: Rot
            dta 255,128,  0     ; Farbe  2: Orange
            dta 255,255,  0     ; Farbe  3: Gelb
            dta 128,255,  0     ; Farbe  4: Hellgruen
            dta   0,255,  0     ; Farbe  5: Gruen
            dta   0,192,255     ; Farbe  6: Himmelblau
            dta  64, 64,255     ; Farbe  7: Blau
            dta 160, 64,255     ; Farbe  8: Lila
            dta 255,  0,255     ; Farbe  9: Pink
            dta 255,128,192     ; Farbe 10: Rosa
FARB_ANZ    = (*-farben)/3      ; Anzahl der Farben (hier 10)

;------------------------------------------------------------------------------
;  HAUPTPROGRAMM
;------------------------------------------------------------------------------
start       lda VBXE_TYP
            cmp #$10            ; ist eine VBXE da?
            bne ende            ; nein -> sofort zurueck

            lda #0
            sta ANTIC           ; normales Atari-Bild aus
            jsr vram_fuellen    ; XDL, Zeichensatz und Text ins VRAM
            jsr palette_setzen  ; eigene Farben in Palette 1 laden

            lda #0              ; XDL liegt bei VRAM-Adresse 0
            sta XDL_ADR
            sta XDL_ADR+1
            sta XDL_ADR+2
            lda #1
            sta VBXE_AN         ; VBXE-Bild an!

;--- Hauptschleife: in jedem Bild eine Zeile weiter, bis eine Taste kommt ---
            lda #$FF
            sta TASTE
haupt       jsr bild_warten     ; NEU: auf das naechste Bild warten
            jsr scrollen        ; NEU: Text eine Bildzeile tiefer
            lda TASTE
            cmp #$FF            ; Taste gedrueckt?
            beq haupt           ; nein -> weiter scrollen

            lda #0              ; alles wieder aus
            sta VBXE_AN
            sta FENSTER_BANK
            lda #$22
            sta ANTIC           ; normales Atari-Bild wieder an
            lda #$FF
            sta TASTE
ende        rts                 ; zurueck ins DOS

;------------------------------------------------------------------------------
;  PROZEDUREN
;------------------------------------------------------------------------------

; vram_fuellen: Fenster oeffnen, dann XDL, Zeichensatz und Text kopieren
;               Das Fenster bleibt danach offen - das braucht das Scrollen!
vram_fuellen
            lda #$98            ; Fenster bei $9000, CPU darf zugreifen
            sta FENSTER_AN
            lda #$80            ; Fenster an, VRAM ab Adresse 0 zeigen
            sta FENSTER_BANK

            ldx #0              ; 256 Durchlaeufe:
kopieren    lda xdl,x           ;   XDL kopieren
            sta FENSTER,x
            lda #0              ;   Textzeile loeschen
            sta TEXT_ZEILE,x
            lda $E000,x         ;   Zeichensatz aus dem ROM (1 KB)
            sta ZEICHENSATZ,x
            lda $E100,x
            sta ZEICHENSATZ+$100,x
            lda $E200,x
            sta ZEICHENSATZ+$200,x
            lda $E300,x
            sta ZEICHENSATZ+$300,x
            inx
            bne kopieren

            ldx #21             ; Text (22 Bytes) in die Bildmitte
text_kop    lda text,x
            sta TEXT_ZEILE+68,x ; 68 = Spalte 34
            dex
            bpl text_kop
            rts

; palette_setzen: schreibt unsere Farben 1-10 in Palette 1
palette_setzen
            lda #1
            sta PALETTE_NR      ; Palette 1 bearbeiten
            sta FARB_NR         ; bei Farbe 1 anfangen
            ldx #0              ; X = Lesezeiger in der Tabelle
            ldy #FARB_ANZ       ; Y = wie viele Farben noch
farb_kop    lda farben,x        ; Rot holen
            sta ROT
            lda farben+1,x      ; Gruen holen
            sta GRUEN
            lda farben+2,x      ; Blau holen
            sta BLAU            ; -> Farbe fertig, FARB_NR zaehlt selbst +1
            inx                 ; 3 Bytes weiter zur naechsten Farbe
            inx
            inx
            dey                 ; eine Farbe weniger uebrig
            bne farb_kop        ; noch Farben da? -> weiter
            rts

; NEU - bild_warten: wartet, bis das naechste Bild beginnt
;       Die UHR zaehlt am Anfang jedes Bildes 1 hoch. Wir warten einfach,
;       bis sie sich aendert - so scrollt der Text gleichmaessig.
bild_warten
            lda UHR             ; aktuellen Stand merken
warte_uhr   cmp UHR             ; noch derselbe?
            beq warte_uhr       ; ja -> weiter warten
            rts

; NEU - scrollen: Text eine Bildzeile tiefer, unten angekommen -> wieder oben
;       Das Byte in der XDL ist selbst unser Zaehler - wir zaehlen direkt dort.
scrollen    ldx LEER_IM_VRAM    ; leere Zeilen aus der XDL holen
            inx                 ; eine Zeile tiefer
            cpx #ZEILE_MAX+1    ; unten angekommen?
            bne scr_ok          ; nein -> so lassen
            ldx #0              ; ja -> wieder ganz oben
scr_ok      stx LEER_IM_VRAM    ; zurueck in die XDL
            rts

            run start

AntwortZitat

... ganz einfach ... eine waagerechte Linie einfarbig mittels VBXE gezeichnet. Es hier darum zu zeigen, welche Register,Farben usw. gesetzt werden müssen. Wir werden dann komplexer ;-)

;==============================================================================
;  VBXELinieEinfach.asm - VBXE: eine waagerechte Linie in einer Farbe
;
;  Bild: 320 x 192 Punkte, 1 Byte pro Punkt, Farben aus Palette 1.
;  Farbe 1 wird auf Gelb gesetzt, dann wird Zeile 96 (Bildmitte) mit
;  Farbe 1 gefuellt. Das ist die Linie.
;
;  VRAM:   $000000  XDL
;          $010000  Bild (320 x 192 = 61440 Bytes = 15 Baenke zu 4 KB)
;  Der Atari sieht das VRAM durch ein 4-KB-Fenster bei $9000 (MEMAC A).
;
;  Assemblieren: mads VBXELinieEinfach.asm -o:VBXELinieEinfach.xex
;==============================================================================

;------------------------------------------------------------------------------
;  VARIABLEN UND KONSTANTEN
;------------------------------------------------------------------------------
VB_VIDEO        = $D640     ; Video-Steuerung (Bit 0 = XDL an)
VB_XDL0         = $D641     ; Adresse der XDL im VRAM (3 Bytes)
VB_XDL1         = $D642
VB_XDL2         = $D643
VB_FARB_NR      = $D644     ; Farbnummer, die gesetzt wird
VB_PALETTE      = $D645     ; welche Palette (1 = Overlay)
VB_ROT          = $D646     ; Rot, Gruen, Blau der Farbe
VB_GRUEN        = $D647
VB_BLAU         = $D648
VB_FENSTER      = $D65E     ; MEMAC A: Lage und Groesse des Fensters
VB_BANK         = $D65F     ; MEMAC A: Bit 7 = Fenster an, Bits 0-6 = Bank

FENSTER         = $9000     ; hier sieht der Atari das VRAM (4 KB)
FENSTER_EIN     = %10011000 ; Bits 4-7 = $9 (Fenster bei $9000),
                            ; Bit 3 = CPU darf zugreifen, Bits 0-1 = 00 (4 KB)
BANK_AN         = %10000000 ; Bit 7: Fenster einschalten

; Zeile 96 liegt bei VRAM $010000 + 96 * 320 = $017800
; -> Bank $17, im Fenster ab $9000 + $800 = $9800
LINIE_BANK      = $17
LINIE_ADR       = FENSTER+$800

zeiger          = $80       ; Zero Page: Zeiger ins Fenster (2 Bytes)

                org $2000

;------------------------------------------------------------------------------
;  DISPLAYLISTE (XDL) - kommt nach VRAM $000000
;  Steuerwort = 2 Bytes, niedriges Byte zuerst (Bits 0-7, dann Bits 8-15).
;  Danach die Zusatz-Bytes in dieser Reihenfolge: RPTL, OVADR, OVATT.
;------------------------------------------------------------------------------
xdl
;--- Befehl 1: 24 leere Bildzeilen oben ---
                .byte %00100100     ; Bits 0-7:  OVOFF (Bit 2), RPTL (Bit 5)
                .byte %00000000     ; Bits 8-15: nichts
                .byte 23            ; RPTL: 23 + 1 = 24 Bildzeilen

;--- Befehl 2: 192 Zeilen Grafik, 320 Punkte, 1 Byte pro Punkt, dann Ende ---
                .byte %01100010     ; Bits 0-7:  GMON (Bit 1), RPTL (Bit 5), OVADR (Bit 6)
                .byte %10001000     ; Bits 8-15: OVATT (Bit 11), END (Bit 15)
                .byte 191           ; RPTL: 191 + 1 = 192 Bildzeilen
                .byte $00,$00,$01   ; OVADR: Bild bei VRAM $010000 (niedrig, mittel, hoch)
                .byte $40,$01       ; OVADR: Schritt 320 Bytes pro Bildzeile
                .byte %00010001     ; OVATT: Bits 0-1 = 01 normale Breite, Bits 4-5 = 01 Palette 1
                .byte %11111111     ; OVATT: Prioritaet: Overlay vor allem
xdl_ende

;------------------------------------------------------------------------------
;  HAUPTPROGRAMM
;------------------------------------------------------------------------------
start
                lda #FENSTER_EIN
                sta VB_FENSTER      ; VRAM-Fenster bei $9000 einrichten

                jsr xdl_kopieren
                jsr farbe_setzen
                jsr bild_loeschen
                jsr linie_malen

                lda #0              ; XDL liegt bei VRAM $000000
                sta VB_XDL0
                sta VB_XDL1
                sta VB_XDL2
                lda #1
                sta VB_VIDEO        ; Overlay einschalten

;--- Hauptschleife: nichts mehr zu tun ---
haupt           jmp haupt

;------------------------------------------------------------------------------
;  PROZEDUREN
;------------------------------------------------------------------------------

; xdl_kopieren: XDL ins VRAM (Bank 0) schreiben
xdl_kopieren
                lda #BANK_AN+0
                sta VB_BANK
                ldx #xdl_ende-xdl-1
@               lda xdl,x
                sta FENSTER,x
                dex
                bpl @-
                rts

; farbe_setzen: Farbe 1 in Palette 1 = Gelb
farbe_setzen
                lda #1
                sta VB_PALETTE
                sta VB_FARB_NR
                lda #255
                sta VB_ROT
                sta VB_GRUEN
                lda #0
                sta VB_BLAU
                rts

; bild_loeschen: alle 15 Baenke des Bilds (Bank $10-$1E) mit Farbe 0 fuellen
bild_loeschen
                ldx #$10
bl_bank         txa
                ora #BANK_AN
                sta VB_BANK
                lda #>FENSTER
                sta zeiger+1
                lda #0
                sta zeiger
                tay
@               sta (zeiger),y
                iny
                bne @-
                inc zeiger+1        ; naechste 256 Bytes
                ldy zeiger+1
                cpy #>(FENSTER+$1000)
                ldy #0
                bcc @-
                inx
                cpx #$10+15
                bne bl_bank
                rts

; linie_malen: 320 Bytes ab Zeile 96 mit Farbe 1 fuellen
linie_malen
                lda #BANK_AN+LINIE_BANK
                sta VB_BANK
                lda #1              ; Farbe 1
                ldx #0
@               sta LINIE_ADR,x     ; Punkte 0-255
                inx
                bne @-
                ldx #320-256-1
@               sta LINIE_ADR+256,x ; Punkte 256-319
                dex
                bpl @-
                lda #0              ; Fenster zu
                sta VB_BANK
                rts

                run start

AntwortZitat

Nächste Woche werde ich mich mit deinen Beispielen mal beschäftigten. Bis dahin schon mal Vielen Dank!

AntwortZitat

... ich frage mich jetzt allerdings, ob ich erstmal die Sache hier stoppe und den neuen Core erkunde und alles dann auf den neuen Core schreibe?! Der neue Core ist insofern wohl sehr interessant, weil die Änderungen voll auf mein RayCast Thema abzielen... das scheint eh gerade zu kommen....

Was ist eure werte Meinung dazu?

AntwortZitat

Ich weiß nicht, was die nächsten Schritte sind und kenne mich mit der VBXE auch zu wenig aus. Aber da wir noch ganz am Anfang stehen, sollte die Core-Änderung noch keinen Einfluss auf den aktuellen Stand des Tutorial haben?

Mein 600XL ist virenfrei!

AntwortZitat

Ich bin da ja immer etwas zögerlich was brandneue Software betrifft. Ich warte da lieber immer etwas, bis die gröbsten Bugs beseitigt sind. Mittlerweile scheint es ja auch schon das dritte Release von der 1.27er Version zu geben... Mein 1.26er System funktioniert einwandfrei und ich arbeite auch mit Sparta-DOS und 80 Zeichen. Anscheinend muss Sparta-DOS jetzt an den neuen Kern angepasst werden. Da würde ich im Moment lieber noch die Finger davon lassen um nachher nicht noch mehr Baustellen aufzumachen. Wenn die neue Version für dich Vorteile bringt, dann würde ich damit arbeiten. Aber unterm Strich sollten die Grundlagen ja jetzt nicht sooo verschieden sein.

Viele Grüße und Danke für den Engagement!

AntwortZitat